package p9selfQueryParse;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.util.Version;

import java.text.SimpleDateFormat;
import java.util.regex.Pattern;

/**
 * 比如要禁用 wildcardQuery 和funnzzyQuery  只要禁用
 * QueryParser 中的getWildCardQuery 和 get FunnzyQuery 方法就行了(抛出异常)
 */
public class CustomerQueryParse extends QueryParser{
    public CustomerQueryParse(Version matchVersion, String f, Analyzer a) {
        super(matchVersion, f, a);
    }

    @Override
    protected Query getWildcardQuery(String field, String termStr) throws ParseException {
        //为什么 不用通配符查询呢？比如在数据库中我们可能用通配符查询，但是在lucen中，我们已经做了全文索引了，不必再
        //用通配符查询了
        throw new ParseException("由于性能原因，已经禁用通配符查询，请使用精确查询");
    }

    @Override
    protected Query getFuzzyQuery(String field, String termStr, float minSimilarity) throws ParseException {
        throw new ParseException("由于性能原因，已经禁用通配符查询，请使用精确查询");
    }
    //inclusive 这个参数表示是否是闭区间 part1  part2 表示范围如 [20,50]
    @Override
    protected Query getRangeQuery(String field, String part1, String part2, boolean inclusive) throws ParseException {
        //这个attch 是个int 类型的
        if(field.equals("ataches")){//针对数字类型
          //这个是只针对 NumericRangeQuery 如果不符合条件就用supper 的
          return   NumericRangeQuery.newIntRange(field,Integer.parseInt(part1),Integer.parseInt(part2),inclusive,inclusive);
        }
        if(field.equals("date")){
            String fomate="yyyy-MM-dd";
            SimpleDateFormat dateFormat= new SimpleDateFormat(fomate);
            Pattern pattern=Pattern.compile("\\d\\d\\d\\d-\\d\\d-\\d\\d");
            if(pattern.matcher(part1).matches()&& pattern.matcher(part2).matches()){//验证是否是日期格式
                try {
                    long start=dateFormat.parse(part1).getTime();
                    long end=dateFormat.parse(part2).getTime();
                    return   NumericRangeQuery.newLongRange(field,start,end,inclusive,inclusive);
                } catch (java.text.ParseException e) {
                    e.printStackTrace();
                }

            }
        }
       // return new TermRangeQuery(field, part1, part2, inclusive,inclusive);
        return  super.getRangeQuery(field, part1, part2,inclusive);
    }
}
